

#include "json_rw_ID.h"

namespace tbox_msg
{

    std::string jsonTboxId::get_filecontent(const char *filePath, const char *fileName)
    {
        std::string fileDir(filePath); // 获取顶层头文件 方便使用相对路径
        fileDir.append("/");
        fileDir.append(fileName);         // 生成路径相关的字符串，方便去访问文件
        std::ifstream in(fileDir.data()); // 文件的读取操作， copy的  不解释
        if (!in.is_open())
        {
            printf("err here:%s,%d\r\n", __FILE__, __LINE__);
            printf("faild open %s\r\n", fileDir.data());
        }
        std::string json_content((std::istreambuf_iterator<char>(in)),
                                 std::istreambuf_iterator<char>());
        // 将文件的数据流转换位std::string类型
        // cout<<json_content<<endl;
        in.close(); // 关闭文件
        json_content_path = json_content;
        return json_content; // 将处理之后的std::string 返回
    }

    bool jsonTboxId::tbox_read_id(const std::string json_content)
    {
        if (document.Parse(json_content_path.c_str()).HasParseError())
        { // 判断语法是否有问题
            printf("err here %s,%d\r\n", __FILE__, __LINE__);
            return false;
        }
        else
        {
            if (document.HasMember("device_name"))
            {
                if (document["device_name"].IsString())
                    device_name = document["device_name"].GetString();
            }
            if (document.HasMember("product_key"))
            {
                if (document["product_key"].IsString())
                    product_key = document["product_key"].GetString();
            }
            if (document.HasMember("user_name"))
            {
                if (document["user_name"].IsString())
                    user_name = document["user_name"].GetString();
            }
            if (document.HasMember("password"))
            {
                if (document["password"].IsString())
                    password = document["password"].GetString();
            }
            if (document.HasMember("client_id"))
            {
                if (document["client_id"].IsString())
                    client_id = document["client_id"].GetString();
            }
        }
        return true;
    }

    bool jsonTboxId::tbox_write_id(const char *filePath, const char *filename)
    {
        char time_buf[64];
        time_t nowtime;
        time(&nowtime);              // 获取1970年1月1日0点0分0秒到现在经过的秒数
        tm *p = localtime(&nowtime); // 将秒数转换为本地时间,年从1900算起,需要+1900,月为0-11,所以要+1
        sprintf(time_buf, " %04d:%02d:%02d %02d:%02d:%02d ", p->tm_year + 1900, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);

        std::cout << "time_buf " << time_buf << std::endl;
        rapidjson::StringBuffer buffer;
        rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(buffer);
        document.SetObject();
        document.AddMember(rapidjson::StringRef("create_time"), rapidjson::StringRef(time_buf), document.GetAllocator());
        document.AddMember(rapidjson::StringRef("client_id"), rapidjson::StringRef(client_id.c_str()), document.GetAllocator());
        document.AddMember(rapidjson::StringRef("user_name"), rapidjson::StringRef(user_name.c_str()), document.GetAllocator());
        document.AddMember(rapidjson::StringRef("password"), rapidjson::StringRef(password.c_str()), document.GetAllocator());
        document.AddMember(rapidjson::StringRef("product_key"), rapidjson::StringRef(product_key.c_str()), document.GetAllocator());
        document.AddMember(rapidjson::StringRef("device_name"), rapidjson::StringRef(device_name.c_str()), document.GetAllocator());

        // PrettyWriter  这个词很关键 如果只是Write的话  写入的结构会比较难看，但是更省空间？
        document.Accept(writer);
        std::string Path(filePath); // 将文件顶层路径转换位std::string 类型
        Path.append("/");
        Path.append(filename); // 添加相对路径
        std::string temp(buffer.GetString());

        std::ofstream outfile;
        outfile.open(Path.data());
        if (outfile.fail())
        {
            printf("open file %s error\r\n", Path.data());
            printf("err here: %s,%d\r\n", __FILE__, __LINE__);
            return false;
        }
        else
        {
            outfile << temp;
            outfile.close();
            return true;
            // 关于文件写入部分，确实不熟悉，不去过多的解释，抛砖引玉吧。
            // 抄的那里的代码也忘了  实在抱歉
        }
    }

}

// int main(void)
// {
//     jsonTboxId json_tbox_id;
//     std::string json_content = get_filecontent("my_test.json");
//     json_tbox_id.prase_tbox_id(json_content);

//     json_tbox_id.pack_tbox_id("my_test_3.json");
//     // prettyWritefile("my_test_2.json", document); // 将修改之后的文件写磁盘
//     printf("success!\r\n");
//     std::string s;
//     std::cin >> s; // 卡住cmd 看打印信息
//     return 0;
// }

// cmake -G "MinGW Makefiles" ..
// mingw32-make
